From 8b00e587705ee1235bd294df8bfabc318262193d Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 20 Sep 2005 14:44:49 +0000 Subject: [PATCH] Fix __save_flags() to not complain when smp_processor_id() is used in a preemptible region (it is always safe). Signed-off-by: Keir Fraser --- .../include/asm-xen/asm-i386/system.h | 31 +++++++++++-------- .../include/asm-xen/asm-x86_64/system.h | 31 +++++++++++-------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/system.h b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/system.h index a627fbf4fc..f930c4cec6 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/system.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/system.h @@ -497,11 +497,22 @@ __asm__ __volatile__("6667:movl %1, %0\n6668:\n" \ * includes these barriers, for example. */ +/* + * Don't use smp_processor_id() in preemptible code: debug builds will barf. + * It's okay in these cases as we only read the upcall mask in preemptible + * regions, which is always safe. + */ +#ifdef CONFIG_SMP +#define __this_cpu() __smp_processor_id() +#else +#define __this_cpu() 0 +#endif + #define __cli() \ do { \ vcpu_info_t *_vcpu; \ preempt_disable(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ _vcpu->evtchn_upcall_mask = 1; \ preempt_enable_no_resched(); \ barrier(); \ @@ -512,7 +523,7 @@ do { \ vcpu_info_t *_vcpu; \ barrier(); \ preempt_disable(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ _vcpu->evtchn_upcall_mask = 0; \ barrier(); /* unmask then check (avoid races) */ \ if ( unlikely(_vcpu->evtchn_upcall_pending) ) \ @@ -523,7 +534,7 @@ do { \ #define __save_flags(x) \ do { \ vcpu_info_t *_vcpu; \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ (x) = _vcpu->evtchn_upcall_mask; \ } while (0) @@ -532,7 +543,7 @@ do { \ vcpu_info_t *_vcpu; \ barrier(); \ preempt_disable(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ if ((_vcpu->evtchn_upcall_mask = (x)) == 0) { \ barrier(); /* unmask then check (avoid races) */ \ if ( unlikely(_vcpu->evtchn_upcall_pending) ) \ @@ -548,7 +559,7 @@ do { \ do { \ vcpu_info_t *_vcpu; \ preempt_disable(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ (x) = _vcpu->evtchn_upcall_mask; \ _vcpu->evtchn_upcall_mask = 1; \ preempt_enable_no_resched(); \ @@ -561,14 +572,8 @@ do { \ #define local_irq_disable() __cli() #define local_irq_enable() __sti() -/* Don't use smp_processor_id: this is called in debug versions of that fn. */ -#ifdef CONFIG_SMP -#define irqs_disabled() \ - HYPERVISOR_shared_info->vcpu_data[__smp_processor_id()].evtchn_upcall_mask -#else -#define irqs_disabled() \ - HYPERVISOR_shared_info->vcpu_data[0].evtchn_upcall_mask -#endif +#define irqs_disabled() \ + HYPERVISOR_shared_info->vcpu_data[__this_cpu()].evtchn_upcall_mask /* * disable hlt during certain critical i/o operations diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/system.h b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/system.h index d06d1485eb..cf3badc58c 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/system.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/system.h @@ -321,11 +321,22 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, * includes these barriers, for example. */ +/* + * Don't use smp_processor_id() in preemptible code: debug builds will barf. + * It's okay in these cases as we only read the upcall mask in preemptible + * regions, which is always safe. + */ +#ifdef CONFIG_SMP +#define __this_cpu() __smp_processor_id() +#else +#define __this_cpu() 0 +#endif + #define __cli() \ do { \ vcpu_info_t *_vcpu; \ preempt_disable(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ _vcpu->evtchn_upcall_mask = 1; \ preempt_enable_no_resched(); \ barrier(); \ @@ -336,7 +347,7 @@ do { \ vcpu_info_t *_vcpu; \ barrier(); \ preempt_disable(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ _vcpu->evtchn_upcall_mask = 0; \ barrier(); /* unmask then check (avoid races) */ \ if ( unlikely(_vcpu->evtchn_upcall_pending) ) \ @@ -347,7 +358,7 @@ do { \ #define __save_flags(x) \ do { \ vcpu_info_t *_vcpu; \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ (x) = _vcpu->evtchn_upcall_mask; \ } while (0) @@ -356,7 +367,7 @@ do { \ vcpu_info_t *_vcpu; \ barrier(); \ preempt_disable(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ if ((_vcpu->evtchn_upcall_mask = (x)) == 0) { \ barrier(); /* unmask then check (avoid races) */ \ if ( unlikely(_vcpu->evtchn_upcall_pending) ) \ @@ -372,7 +383,7 @@ do { \ do { \ vcpu_info_t *_vcpu; \ preempt_disable(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_data[smp_processor_id()]; \ + _vcpu = &HYPERVISOR_shared_info->vcpu_data[__this_cpu()]; \ (x) = _vcpu->evtchn_upcall_mask; \ _vcpu->evtchn_upcall_mask = 1; \ preempt_enable_no_resched(); \ @@ -387,14 +398,8 @@ void cpu_idle_wait(void); #define local_irq_disable() __cli() #define local_irq_enable() __sti() -/* Don't use smp_processor_id: this is called in debug versions of that fn. */ -#ifdef CONFIG_SMP -#define irqs_disabled() \ - HYPERVISOR_shared_info->vcpu_data[__smp_processor_id()].evtchn_upcall_mask -#else -#define irqs_disabled() \ - HYPERVISOR_shared_info->vcpu_data[0].evtchn_upcall_mask -#endif +#define irqs_disabled() \ + HYPERVISOR_shared_info->vcpu_data[__this_cpu()].evtchn_upcall_mask /* * disable hlt during certain critical i/o operations -- 2.30.2